1.SDN介绍
传统IP网络因其分布式网络架构导致网络流量路径的灵活调整能力不足,网络协议实现复杂,运维难度大,网络新业务升级速度较慢。
SDN(Software Defined Network)即软件定义网络,试图摆脱硬件对网络架构的限制,以便可以像升级、安装软件一样对网络进行修改,其本质是网络的软件化,提升网络可编程能力。SDN的核心技术就是把网络设备的控制平面和转发平面分离,采用集中控制的方式替代原本分散在各个网络设备上的控制引擎功能,通过定义开放的可编程接口实现业务的灵活定制,进而实现对网络架构的重构。
2.创建试验
2.1.登录试验平台网站:https://ceni.ustc.edu.cn ;
2.2.点击“试验控制台”、“我的试验”、“创建新的试验”;
2.3.填写试验名称及描述,选择试验分类为“sdn试验”;
2.4.拖拽“VM”, 共创建5个节点:
ovs
节点:选择Ubuntu16-desktop
镜像,并在网络中选择4个网段,分别为172.16.0.0/16,1.1.1.0/24,2.2.2.0/24和3.3.3.0/24control
节点:选择Ubuntu下的sdn-control
镜像,网络中确保172.16.0.0/16网段选中- 三个主机(host1、host2、host3)节点:选择
Ubuntu16-desktop
镜像,三个节点的网段分别为1.1.1.0/24,2.2.2.0/24和3.3.3.0/24
注:没有的网段可在【网络管理】中自行配置
2.5.创建链路,设置好链路及网关:
- 将
ovs
的1.1.1.0与h1的1.1.1.0连接 - 将
ovs
的2.2.2.0与h2的2.2.2.0连接 - 将
ovs
的3.3.3.0与h3的3.3.3.0连接
2.6.设置完成后点击“创建试验”,试验拓扑如下:
2.7.创建完毕后,点击“节点链路”,可以查看验证节点和链路状态,点击“运行试验”(耗时较长,请耐心等待),然后点击“打开控制台”,就可以开始正式试验。
注:本试验环境为控制器(Ubuntu18 floodlight v1.2)、
ovs
(Ubuntu16 2.5.9),其他版本下载可访问floodlight
官网 https://floodlight.atlassian.net/wiki/spaces/floodlightcontroller/over 和ovs
官网 http://www.openvswitch.org/ 注:实验节点的登录账号和密码详情可在“节点链路”中查看,其中控制器虚拟机请使用control
账户密码登录
3.验证ovs
的基本功能
尽管ovs
是在充当软件交换机的主机上安装并初始化的,但尚未进行配置。所以,需要对ovs
进行配置,本小节主要对ovs
进行配置并验证其基本功能。
3.1.配置软件交换机
(1)登录到ovs
主机,首先配置网关连接外网安装ovs
,打开新的终端,输入:
$ sudo route add default gw 172.16.0.1 ens3
$ sudo apt-get update
$ sudo apt install openvswitch-switch
然后创建两个以太网桥,将其用作我们的软件交换机,输入:
$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-br br1
注:ens3是IP为172.16..对应的网卡,可以连接外网
(2)准备为ovs
交换机添加端口
因为您的ovs
网桥将是第2层交换机,所以端口不需要IP地址。在我们移除它们之前,我们先跟踪一些信息,运行ifconfig,结果如下
记下与主机连接对应的接口名称。您将看到三个IP地址(例如:1.1.1.85、2.2.2.185和3.3.3.156)的接口,它们分别连接到主机1,主机2和主机3。
(3)从端口中删除IP
注意不要降低ens3。这是控制接口,如果您将该接口调低,您将无法登录到您的主机。对于除 ens3 和 lo 之外的所有接口(您的端口名称可能会有所不同),请运行:
$ sudo ifconfig ens4 0
$ sudo ifconfig ens5 0
$ sudo ifconfig ens6 0
(4)添加端口 因此,既然已经知道了三个主机对应的端口名称,就可以将这三个端口添加到我们的网桥,请注意不要添加接口 ens3,这是控制接口。
$ sudo ovs-vsctl add-port br0 ens4
$ sudo ovs-vsctl add-port br0 ens5
$ sudo ovs-vsctl add-port br1 ens6
此时,您已经配置好了两个软件交换机。要验证软件交换机的配置情况,请运行:
$ sudo ovs-vsctl show
此时拓扑结构应该如下:
3.2.ovs
的基本功能
(1)验证主机之间通信
(i)分别登录三台主机,查看网络配置,请运行:
$ sudo ip addr
写下三个主机各自的IP(例如:1.1.1.231,2.2.2.164,3.3.3.184,您的实际IP地址可能有所不同),尝试主机之间的流量转发。
(ii)首先启动从host1到host2以及host1到host3的ping操作,该操作应该失败,因为三个主机不在同一子网,交换机无法正常工作,在host1中输入:
$ ping 2.2.2.164
# connect: Network is unreachable
$ ping 3.3.3.184
# connect: Network is unreachable
(iii)此时重新配置三个主机的IP地址,将其配置为同一子网(例如:将IP分别配置为10.0.0.1,10.0.0.2,10.0.0.3)。在三个主机中分别配置IP, 登录host1,运行:
$ sudo ifconfig ens3 10.0.0.1
登录host2,运行:
$ sudo ifconfig ens3 10.0.0.2
登录host3,运行:
$ sudo ifconfig ens3 10.0.0.3
(iv)将三个主机配置为同一子网后,再次尝试host1到host2以及host1到host3的ping操作,在host1中输入:
$ ping 10.0.0.2
此时,host1与host2之间应该可以正常通信,
ping 10.0.0.3
host1与host3之间应该不能通信,这是因为host1与host3分别连接在不同的软件交换机(br0,br1)上。
(v)登录ovs
主机,将两个软件交换机br0与br1相连,运行:
$ sudo ovs-vsctl add-port br0 patch0 # 若报错,再次执行见 already exists,可继续执行,不影响
$ sudo ovs-vsctl set interface patch0 type=patch
$ sudo ovs-vsctl add-port br1 patch1
$ sudo ovs-vsctl set interface patch1 type=patch
$ sudo ovs-vsctl set interface patch0 options:peer=patch1
$ sudo ovs-vsctl set interface patch1 options:peer=patch0
此时拓扑结构应该如下:
(vi)登录host1,再次执行host1到host3的ping操作,此时host1与host3之间应该可以正常通信:
$ ping 10.0.0.3
(vii)此外,ovs
可以进行vlan
设置,登录ovs
主机,运行:
$ sudo ovs-vsctl set Port ens4 tag=101
$ sudo ovs-vsctl set Port ens5 tag=102
$ sudo ovs-vsctl set Port ens6 tag=101
查看此时交换机端口配置,运行:
$ sudo ovs-vsctl show
(viii)再次登录host1,分别执行host1到host2以及host1到host3的ping操作,在host1中运行:
$ ping 10.0.0.2
$ ping 10.0.0.3
此时,host1与host3之间应该可以正常通信,而host1与host2之间应该不能通信,这是由于host1与host3属于同一vlan
,而host2则属于不同的vlan
,此时拓扑结构如下:
(ix)结束ovs
基本功能的验证,删除软件交换机,在ovs
节点运行:
$ sudo ovs-vsctl del-br br0
$ sudo ovs-vsctl del-br br1
3.3.运行OpenFlow控制器
本小节主要实现floodlight
控制器对ovs
的具体控制操作。接下来,我们将软件交换机ovs
连接floodlight控制器,构建如下图拓扑:
(1)登录到您的ovs
创建以太网桥,将其用作我们的软件交换机:
$ sudo ovs-vsctl add-br br0
在软件交换机上添加三个主机对应的端口,在ovs
终端窗口运行:
$ sudo ovs-vsctl add-port br0 ens4
$ sudo ovs-vsctl add-port br0 ens5
$ sudo ovs-vsctl add-port br0 ens6
(2)将交换机指向控制器
(i)登录到您的控制器
找到控制器的控制接口IP
,使用ifconfig
并记下ens3
的IP
地址。
为了将我们的软件OpenFlow
交换机指向控制器,在ovs
终端窗口中,运行:
$ sudo ovs-vsctl set-controller br0 tcp:<controller_ip>:6653
注:
<controller_ip>
为控制器节点对应的ip
,实际运行时,去掉”< >”号
(3)独立与安全模式
OpenFlow控制器通过控制网络与交换机进行通信,并且只要ovs
主机可以访问,它就可以在Internet中的任何位置。当ovs
交换机连接OpenFlow控制器后,如果控制器正常工作,则会负责设置交换机上的所有流。而当控制器关闭时,该交换机会默认恢复为普通的学习型2层交换机。但是在有些情况,这可能是不可取的。所以,在ovs
中,存在一个可调参数,称为故障安全模式,可以将其设置为以下参数:
standalone [default]:(独立[默认])在这种情况下,如果控制器发生故障,ovs
将负责转发数据包
secure:(安全)在这种情况下,仅控制器负责转发数据包,如果控制器关闭,则所有数据包都将被丢弃。
在ovs
中,如果未设置参数,则默认为独立模式。在本教程中,我们将故障安全模式设置为安全,因为我们希望成为控制转发的人,运行:
$ sudo ovs-vsctl set-fail-mode br0 secure
(4)启动控制器
(i)首先启动从host1
到host2
的ping
操作,该操作应该不可达,因为没有控制器在运行,在host1
运行:
$ ping 10.0.0.2
(ii)登录控制终端,可以通过运行以下命令来启动Floodlight
控制器:
$ cd floodlight
$ sudo java -jar target/floodlight.jar
输出应该如下:
在ovs
节点中打开终端,输入:
$ sudo ovs-vsctl show
会出现 is_connected : true
表示ovs
已经成功连接控制器,结果如下:
(iii)在host1的终端窗口中,重新对host2执行ping操作:
$ ping 10.0.0.2
可以看到结果如下:
现在ping应该可以工作了。您可以看到第一个ICMP数据包的时间比其余的ICMP数据包的时间更长。这是因为ovs
第一次发生入包事件时会咨询控制器。然后,控制器将流插入ovs
中,交换机将查询该流以了解进一步的包入事件。类似地,从主机1 ping
主机3,即10.0.0.3
。
(iv)保持以上ping
动作,转到您的ovs
主机并查看流。您应该看到已安装的控制器根据数据包的mac
地址流向。输入以下命令:
$ sudo ovs-ofctl dump-flows br0
结果如下:
如果在命令输出中看不到各个流条目,是因为这些流可能已经超时,因此只需重新运行流量以重新添加流即可。
(5)Web GUI
网络图形用户界面Floodlight
控制器配备了基于Web
的GUI
。通过将您喜爱的浏览器指向以下URL,可以访问GUI
:http://<controller-ip>:8080/ui/index.html
。
注:
<controller-ip>
是controller
节点(ens3)的控制接口的IP
地址。
(6)拓扑细节
在将流插入Open vSwitch
之前,我们将需要有关拓扑的所有详细信息,例如Open vSwitch
的数据路径标识符(DPID),主机的MAC
地址,以及主机连接到Open vSwitch
的端口号等。可以在新的controller
终端中发出以下命令来找到这些详细信息:
首先配置网关,dns
连接外网,安装curl
工具:
ifconfig
查看当前controller
的网卡信息,例如:需要配置的网卡为ens3
然后复制并修改yaml
配置文件:
$ cd /etc/netplan
$ sudo cp tools.yaml 00-installer-config.yaml
$ sudo vi 00-installer-config.yaml
增加后信息如下:
network:
version: 2
renderer: Networkd
ethernets:
ens3:
addresses: [172.16.2.74/16]
dhcp4: no
optional: true
gateway4: 172.16.0.1
nameservers:
addresses: [114.114.114.114]
根据自己的需要配置好后保存文件。(vim保存退出命令 :wq
)
使配置的IP地址生效:
$ sudo netplan apply
# 测试外网连通情况
$ ping baidu.com
连接外网后,可以在新的controller终端中发出以下命令:
$ sudo apt-get update
$ sudo apt install curl
$ curl http://localhost:8080/wm/device/ | python -m json.tool
在输出中,我们获取Floodlight控制器已了解的OpenFlow设备(即ovs
)的列表,运行结果如下:
(7)控制器控制ovs
交换机
OpenFlow
的强大之处在于您可以根据支持的OpenFlow
操作决定以任何方式转发数据包。
(i)一个简单的例子,控制流量转发,使得host1
到host2
的流被丢弃,在控制器打开一个新的终端,运行:
$ curl -X POST -d '{"switch":"<DPID OF OPEN vSWITCH>","name":"flow-1","priority":"32700","in_port":"<PORT OF 10.0.0.1>","active":"true", "eth_type":"0x0800", "eth_src":"<MAC OF 10.0.0.1>", "eth_dst":"<MAC OF 10.0.0.2>", "ipv4_src":"10.0.0.1", "ipv4_dst":"10.0.0.2", "actions":"drop"}' http://localhost:8080/wm/staticflowpusher/json
- 注1:可拷贝的详细代码样例可在
Ubuntu
虚拟机的Firefox
浏览器中打开此网页进行复制修改- 注2:
中内容需对应填写,例如 需填对应10.0.0.1的MAC地址,<>符号需删去 - 此时,在
floodlight
的GUI
可以看到新添加的流表项
(ii)登录host1
,启动从host1
到host2
的ping
操作,该操作应该超时
$ ping 10.0.0.2
(iii)再启动从host1到host3的ping操作,可以正常通信
$ ping 10.0.0.3
(iv)运行流量复制控制器
我们将从Host1发送到Host2上的IPv4流量复制到Hos3。打开一个新的控制器终端并输入以下命令:
$ curl -X POST -d '{"switch":"<DPID OF OPEN vSWITCH>","name":"flow-2","priority":"32768","in_port":"<PORT OF 10.0.0.1>","active":"true", "eth_type":"0x0800", "eth_src":"<MAC OF 10.0.0.1>", "eth_dst":"<MAC OF 10.0.0.2>", "ipv4_src":"10.0.0.1", "ipv4_dst":"10.0.0.2", "actions":"set_eth_dst=<MAC OF 10.0.0.2>,set_ipv4_dst=10.0.0.2,output=<PORT OF 10.0.0.2>,set_eth_dst=<MAC OF 10.0.0.3>,output=<PORT OF 10.0.0.3>"}' http://localhost:8080/wm/staticflowpusher/json
- 注:可拷贝的详细代码样例可在
Ubuntu
虚拟机的Firefox
浏览器中打开此网页进行复制修改- 此时,同样可以在
floodlight
的GUI
可以看到新添加的流表项
(v)再次登录host1
,在终端执行:
$ ping 10.0.0.2
此时可以ping通,这是因为flow-2
的优先级priority
高于flow-1
,所以host1
与host2
之间可以通信。
(vi)登录ovs
,监控连接host3
的端口的流量,应该可以看到复制的从host1
到host2
的流量,打开两个新的命令终端,分别执行:
$ sudo tcpdump –i ens5
$ sudo tcpdump –i ens6
得到的结果如下:
- 可以看到在
ens6
网卡处复制了流量- 注:
ens5
、ens6
分别对应连接h2
、h3
的网卡
(vii)结束试验
登录控制器节点,停止控制器工作:
按Ctrl+C
登录ovs
节点,删除已经建立的软件交换机:
$ sudo ovs-vsctl del-br br0